package Vista;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.FileOutputStream;

import javax.swing.JFileChooser;
import javax.swing.JMenuItem;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
import org.w3c.dom.Document;
import org.w3c.dom.Node;

import Controlador.Controlador;
import juego.Juego;
import juego.Jugador;

public class VistaMenu {
	
	JMenuItem salir;
	JMenuItem acerca= new JMenuItem("Acerca de");
	JMenuItem opcionAbrir=new JMenuItem("Abrir...");
	JMenuItem opcionGuardar = new JMenuItem("Guardar");
	Vista vista;
	public VistaMenu(Vista vista) {	
		this.vista = vista;
	}
	JFileChooser abrirArchivo;
	JFileChooser guardarArchivo;
	public JMenuBar dibujarMenu() {	    
		JMenuBar menu = new JMenuBar();
		JMenu archivo= new JMenu("Archivo");
		JMenu ayuda = new JMenu("Ayuda");
		JMenu opciones = new JMenu("Puntajes");		
		
		JMenuItem opcionVerPuntaje= new JMenuItem("Ver Puntajes");
		JMenuItem opcionSalir = new JMenuItem("Salir");		
		JMenuItem instrucciones = new JMenuItem("Instrucciones");		

		archivo.add(opcionGuardar);
		archivo.add(opcionAbrir);
		opciones.add(opcionVerPuntaje);
		archivo.add(opcionSalir);
		ayuda.add(instrucciones);
		ayuda.add(acerca);
		
		ContenedorVentana ventanaAcercaDe = new ContenedorVentana(new VentanaAboutUs());
		ContenedorVentana ventanaInstrucciones = new ContenedorVentana(new VentanaInstrucciones());
		
		menu.add(archivo);
		menu.add(opciones);
		menu.add(ayuda);
		acerca.addActionListener(ventanaAcercaDe.getListener());
		instrucciones.addActionListener(ventanaInstrucciones.getListener());
		salir=opcionSalir;
		salir.addActionListener(
			new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent arg0) {
					System.exit(0);
					
				}
			});
		opcionAbrir.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent arg0){
				
	            if( abrirArchivo == null ) abrirArchivo = new JFileChooser();
	            abrirArchivo.setFileSelectionMode( JFileChooser.FILES_ONLY );
	 
	            int seleccion = abrirArchivo.showOpenDialog(opcionAbrir);
	 
	            if( seleccion == JFileChooser.APPROVE_OPTION )
	            {
	                File f = abrirArchivo.getSelectedFile();
	                try
	                {
	                	
	        			DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
	        			DocumentBuilder dBuilder = null;
	        			
	        			dBuilder = dbFactory.newDocumentBuilder();
	        			
	        			Document doc = null;
	        			
	        			doc = dBuilder.parse(f);
	        			
	        			doc.getDocumentElement().normalize();
	        			
	        			Node jugadorNodo = doc.getElementsByTagName("Jugador").item(0);
	        			
	                    Jugador jugadorNuevo = Jugador.deserializar(jugadorNodo);
	                    Controlador controlador = new Controlador(jugadorNuevo.getJuego());		
	                    
	        			vista.dispatchEvent(new WindowEvent(vista, WindowEvent.WINDOW_CLOSING));			
	        			vista = new Vista(controlador, jugadorNuevo.getJuego());	
	 
	                }catch( Exception exp){}
	            }
	        }
			
		});
		opcionGuardar.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent arg0){
				
	            if( guardarArchivo == null ) guardarArchivo = new JFileChooser();
	            guardarArchivo.setFileSelectionMode( JFileChooser.FILES_ONLY );
	 
	            int seleccion = guardarArchivo.showSaveDialog(opcionGuardar);
	 
	            if( seleccion == JFileChooser.APPROVE_OPTION )
	            {
	                File archivo_xml = guardarArchivo.getSelectedFile();
	                try
	                {
	                	DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
	            		DocumentBuilder db;

	            		db = dbf.newDocumentBuilder();

	            		org.w3c.dom.Document dom = db.newDocument();
	            		Juego juego = vista.juego;
	            		Jugador jugador = juego.getJugador();
	            		dom.appendChild(jugador.serializar(dom));

	            		// Especifico formato
	            		OutputFormat format = new OutputFormat(dom);
	            		format.setIndenting(true);

	            		// Escribo en el archivo a traves del Stream
	            		XMLSerializer serializer;
	            		serializer = new XMLSerializer(new FileOutputStream(archivo_xml),
	            				format);
	            		serializer.serialize(dom);
	                }catch( Exception exp){}
	            }
	        }
			
		});
		return menu;
	}
}


